package fr.afcepf.atod19.patisserie.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import fr.afcepf.atod19.patisserie.entity.Patisserie;
import fr.afcepf.atod19.patisserie.util.UtilConnexionJDBC;

/**
 * Implementation JDB de l'interface @see {@link Patisserie}.
 *
 * @author Stagiaire
 *
 */
public class DataPatisserieImpl implements IDataPatisserie {
    /**
     * Position du parametre nom dans la requete d'ajout.
     */
    private final int indiceParamNomAjout = 1;
    /**
     * Position du parametre description dans la requete d'ajout.
     */
    private final int indiceParamDescriptionAjout = 2;
    /**
     * Position du parametre prix dans la requete d'ajout.
     */
    private final int indiceParamPrixAjout = 3;
    /**
     * Position du parametre calorie dans la requete d'ajout.
     */
    private final int indiceParamCalorieAjout = 4;
    /**
     * Position du parametre nom dans la requete de recherche.
     */
    private final int indiceParamNomRecherche = 1;
    /**
     * Position du parametre Id dans la requete de manger.
     */
    private final int indiceParamIdManger = 1;
    /**
     * Position de la colonne Id dans la lecture du ResultSet.
     */
    private final int indiceColonneId = 1;
    /**
     * Position de la colonne Nom dans la lecture du ResultSet.
     */
    private final int indiceColonneNom = 2;
    /**
     * Position de la colonne Description dans la lecture du ResultSet.
     */
    private final int indiceColonneDescription = 3;
    /**
     * Position de la colonne Prix dans la lecture du ResultSet.
     */
    private final int indiceColonnePrix = 4;
    /**
     * Position de la colonne Calorie dans la lecture du ResultSet.
     */
    private final int indiceColonneCalorie = 5;
    /**
     * Indice de Cle generee.
     */
    private final int indiceCleGeneree = 1;
    /**
     * Requete pour ajouter une {@link Patisserie}.
     */
    private final String reqAjout =
            "INSERT INTO patisserie (nom, description, prix, calorie) VALUES (?,?,?,?)";
    /**
     * Requete pour rechercher une {@link Patisserie}.
     */
    private final String reqRechercher =
            "SELECT id, nom, description, prix, calorie FROM patisserie WHERE nom like ?";
    /**
     * Requete pour supprimer une {@link Patisserie}.
     */
    private final String  reqManger =
            "Delete FROM patisserie WHERE id = ?";
    @Override
    public Integer ajouter(Patisserie paramPatisserie) {
        Integer retour = null;
        try {
            Connection cnx = UtilConnexionJDBC.getConnection();
            PreparedStatement pstmt =  cnx.prepareStatement(reqAjout, Statement.RETURN_GENERATED_KEYS);
            pstmt.setInt(indiceParamCalorieAjout, paramPatisserie.getCalorie());
            pstmt.setString(indiceParamNomAjout, paramPatisserie.getNom());
            pstmt.setString(indiceParamDescriptionAjout, paramPatisserie.getDescription());
            pstmt.setFloat(indiceParamPrixAjout, paramPatisserie.getPrix());
            int nbLigne = pstmt.executeUpdate();
            if (nbLigne == 1) {
                ResultSet rsKey = pstmt.getGeneratedKeys();
            if (rsKey.next()) {
                retour = rsKey.getInt(indiceCleGeneree);
            }
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return retour;
    }

    @Override
    public Boolean manger(Patisserie paramPatisserie) {
        Boolean retour = false;
        try {
            Connection cnx = UtilConnexionJDBC.getConnection();
            PreparedStatement pstmt =  cnx.prepareStatement(reqManger);
            pstmt.setInt(indiceParamIdManger, paramPatisserie.getId());
            int nbLigne = pstmt.executeUpdate();
            if (nbLigne == 1) {
                retour = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return retour;
    }

    @Override
    public List<Patisserie> rechercher(String paramNom) {
        List<Patisserie> retour = null;
        try {
            Connection cnx = UtilConnexionJDBC.getConnection();
            PreparedStatement pstmt =  cnx.prepareStatement(reqRechercher);
            pstmt.setString(indiceParamNomRecherche, "%" + paramNom + "%");
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
              if (retour == null) {
                  retour = new ArrayList<>();
              }
            Patisserie pat = new Patisserie(rs.getInt(indiceColonneId), rs.getString(indiceColonneNom),
                    rs.getString(indiceColonneDescription), rs.getFloat(indiceColonnePrix),
                    rs.getInt(indiceColonneCalorie));
            retour.add(pat);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return retour;
    }

}
